
// find, findIndex, map, reduce
var data = [
  { id: '01', salary: 10001, name: '张大大', pid: '', job: '项目经理' },
  { id: '02', salary: 10000, name: '小亮', pid: '01', job: '产品leader' },
  { id: '03', salary: 10000, name: '小美', pid: '01', job: 'UIleader' },
  { id: '04', salary: 10000, name: '老马', pid: '01', job: '技术leader' },
  { id: '05', salary: 10000, name: '老王', pid: '01', job: '测试leader' },
  { id: '06', salary: 10000, name: '老李', pid: '01', job: '运维leader' },
  { id: '07', salary: 10000, name: '小丽', pid: '02', job: '产品经理' },
  { id: '08', salary: 10000, name: '大光', pid: '02', job: '产品经理' },
  { id: '09', salary: 10000, name: '小高', pid: '03', job: 'UI设计师' },
  { id: '10', salary: 10000, name: '小刘', pid: '04', job: '前端工程师' },
  { id: '11', salary: 10000, name: '小华', pid: '04', job: '后端工程师' },
  { id: '12', salary: 10000, name: '小李', pid: '04', job: '后端工程师' },
  { id: '13', salary: 10000, name: '小赵', pid: '05', job: '测试工程师' },
  { id: '14', salary: 10000, name: '小强', pid: '05', job: '测试工程师' },
  { id: '15', salary: 10000, name: '小涛', pid: '06', job: '运维工程师' }
]

// ------------- 1. find
// find() 找数组中第一个满足条件的元素，找到就返回该元素，找不到返回undefined

// 找到小刘的同事（不包括他自己），只收集姓名
// const xiaoliu = data.find(item => item.name === "小刘")
// const tongshi = data.filter(item => item.pid === xiaoliu.id && item.name !== '小刘').map(item => item.name)
// console.log(tongshi) // [ '小华', '小李' ]

// --------- 2. findIndex
// 返回满足条件的第一个元素的下标

// --------------- 3. map
// map: 对数组中的每一个元素进行操作，把结果保存到新的数组中，并返回新数组

// -------------- 4. reduce
// reduce() 对数组进行累积运算
// 关键：函数体里思考往sum上累加什么，一定要有return(下次函数体执行sum初始值等return返回的值呢)
// reducer 函数接收4个参数:
// Accumulator (acc) (累计器)
// Current Value (cur) (当前值)
// Current Index (idx) (当前索引)
// Source Array (src) (源数组)
// 您的 reducer 函数的返回值分配给累计器，该返回值在数组的每个迭代中被记住，并最后成为最终的单个结果值。
// 语法：arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
// index: 数组中正在处理的当前元素的索引。 如果提供了initialValue，则起始索引号为0，否则从索引1起始。
// initialValue 作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值，则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
// 注意：如果没有提供initialValue，reduce 会从索引1的地方开始执行 callback 方法，跳过第一个索引。如果提供initialValue，从索引0开始。

// const arr = [5, 10, 20, 35, 42, 50]
// const sum = arr.reduce(function(acc, item, index, self) {
//   // console.log(acc, item, index, self) // acc 累计器, item 当前值, index 当前索引 self源数组
//   return acc + item
// }, 0) // 初始值
// 一定要有return(下次函数体执行acc初始值等return返回的值呢)
// 运行流程：
// 有初始值0，
// 第一次遍历： acc: 0, item: 5, index: 0, 函数体执行：return acc + item  0 + 5 = 5, return给函数体下一次执行时，给acc赋值5
// 第二次遍历： acc: 5, item: 10, index: 1, 函数体执行：return acc + item  5 + 10 = 15, return给函数体下一次执行时，给acc赋值15
// 第二次遍历： acc: 15, item: 20, index: 2, 函数体执行：return acc + item  15 + 20 = 35, return给函数体下一次执行时，给acc赋值35
// ....
// 结束遍历，reduce()方法会把最后acc值返回在原地

// console.log(sum) // 162
// -----------------------------------  无初始值
// const arr = [5, 10, 20, 35, 42, 50]
// const sum2 = arr.reduce(function(acc, item, index, self) {
//   return acc + item
// }) // 无初始值
// console.log(sum2) // 162
// 一定要有return(下次函数体执行acc初始值等return返回的值呢)
// 运行流程：
// 无初始值，
// 第一次遍历： acc: 5, item: 10, index: 1, 函数体执行：return acc + item  5 + 10 = 15, return给函数体下一次执行时，给acc赋值15
// 第二次遍历： acc: 15, item: 20, index: 2, 函数体执行：return acc + item  15 + 20 = 35, return给函数体下一次执行时，给acc赋值35
// 第二次遍历： acc: 35, item: 35, index: 3, 函数体执行：return acc + item  35 + 35 = 70, return给函数体下一次执行时，给acc赋值70
// ....
// 结束遍历，reduce()方法会把最后acc值返回在原地

// console.log(sum) // 162

// ---------------------------- 计算数组里每个对象的值
// const res = data.reduce((acc, item) => {
//   return { salary: acc.salary + item.salary }
// })
// console.log(res) // 15001

// const res2 = data.reduce((acc, item) => {
//   return acc + item.salary
// }, 0)
// console.log(res2) // 15001

// ------------- 累加对象数组里的值
// const arr = [{ x: 1 }, { x: 2 }, { x: 3 }]
// var init = 0
// var sum = arr.reduce((acc, cur) => {
//   return acc + cur.x
// }, init)

// console.log(sum) //  6

// var sum2 = arr.reduce((acc, cur) => {
//   return { x: acc.x + cur.x }
// })
// console.log(sum2) //  {x: 6}

// 计算数组中每个元素出现的次数
// var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']

// var count = names.reduce(function(allNames, name) {
//   if (name in allNames) { // 判断allNames对象中有没有name字段
//     allNames[name]++
//   } else {
//     allNames[name] = 1
//   }
//   return allNames
// }, {}) // 初始值是{} 空对象，allNames初始化 allNames = {}
// console.log(count) // { Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }
// // -----------------------   一样的
// var count2 = names.reduce(function(allNames, name) {
//   if (allNames[name]) { // 判断allNames对象中有没有name字段
//     allNames[name]++
//   } else {
//     allNames[name] = 1
//   }
//   return allNames
// }, {})
// console.log(count2) // { Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }

// 按属性对object分类
// var people = [
//   { name: 'Alice', age: 21 },
//   { name: 'Max', age: 20 },
//   { name: 'Jane', age: 20 }
// ]
// // 假如按age分类
// function groupBy(Array, property) {
//   return Array.reduce(function(acc, obj) {
//     var key = obj[property] // 21
//     if (!acc[key]) { // acc[21]
//       acc[key] = []
//     }
//     acc[key].push(obj) // acc[21].push(obj)
//     return acc
//   }, {})
// }

// var res = groupBy(people, 'age')
// console.log(res)
// // res is:
// {
//   20: [
//     { name: 'Max', age: 20 },
//     { name: 'Jane', age: 20 }
//   ],
//   21: [{ name: 'Alice', age: 21 }]
// }

// const total1 = data.reduce((acc, item) => {
//   return { salary: acc.salary + item.salary }
// })

// const total2 = data.reduce((acc, item) => {
//   return acc + item.salary
// }, 0)

// const total3 = data.map(item => item.salary).reduce((acc, cur) => {
//   return acc + cur
// })

// console.log(total1) // 150001
// console.log(total2) // 150001
// console.log(total3) // 150001

// 如果没有给 reduce设置第二个参数(初始值)，acc在第一次循环的时候，就是第一个元素

// const arr = ['b', 'c', 'b', 'c', 'a', 'b', 'c']

// const obj = arr.reduce((acc, item) => {
//   if (item in acc) {
//     acc[item]++
//   } else {
//     acc[item] = 1
//   }
//   return acc
// }, {})

// const obj = arr.reduce((acc, item) => {
//   acc[item] ? (acc[item]++) : (acc[item] = 1)
//   return acc
// }, {})

// console.log(obj) // { b: 3, c: 3, a: 1 }
